package com.xzzz.irda.guardcat.server.metric;

import com.xzzz.irda.guardcat.server.app.pojo.MachineInfo;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;

/**
 * 指标拉取任务
 *
 * @param <M> {@link MetricRepository} 中存储的对象
 * @author xzzz
 */
@Slf4j
public abstract class MetricFetchJob<M> implements Runnable {

    /**
     * 拉取指标的机器信息
     */
    protected final MachineInfo machine;

    /**
     * 保存指标的实现类
     */
    protected final MetricRepository<M> metricRepository;

    /**
     * 构造方法
     *
     * @param machineInfo      拉取的机器
     * @param metricRepository 指标存储
     */
    public MetricFetchJob(MachineInfo machineInfo, MetricRepository<M> metricRepository) {
        this.machine = machineInfo;
        this.metricRepository = metricRepository;
    }

    /**
     * 拼装URL
     *
     * @param path 请求路径
     * @return 请求URL
     */
    public final String buildUrl(@NonNull String path) {
        return "http://" + machine.getIp() + ":" + machine.getPort() + machine.getServletContextPath() + path;
    }

    /**
     * 保存指标, 并发布指标事件
     *
     * @param m 指标对象
     */
    protected void saveAndPublish(M m) {
        metricRepository.save(machine, m);
        metricRepository.publish(machine, m);
    }
}
